package task1;

import java.util.Arrays;

/**
 * 定义一个长度为[16][16]的整型二维数组并输入或指定所有位置的元素值，分别实现二维数组中所有行和所有列中所有元素的累加和并打印。
 * 再分别实现二维数组中左上角到右下角和右上角到左下角所有元素的累加和并打印。
 */
public class TwoDimenArray {
    public static void main(String[] args) {
        // 定义二维数组
        int[][] array = new int[16][16];
        // 对二维数组输入值
        for (int i = 0;i<array.length;i++){
            for (int j = 0 ;j<array[i].length;j++){
                array[i][j] = i;
                System.out.print(array[i][j] + "\t");
            }
            System.out.println();
        }
        // 对二维数组每行进行求和，结果保存到一维数组中
        int[] heng_sum =new int[array.length];
        for (int i = 0;i<array.length;i++){
            for (int j = 0;j<array[i].length;j++){
                heng_sum[i] += array[i][j];
            }
        }
        // 对二维数组每列进行求和，结果保存到一维数组中
        int[] zong_sum =new int[array[0].length];
        for (int i = 0;i<array.length;i++){
            for (int j = 0;j<array[i].length;j++){
                zong_sum[i] += array[j][i];
            }
        }
        // 对二维数组从左上角到右下角对角线求和，结果保存到一维数组中
        // 规律：00   01+10  02+11+20  03+12+21+30  04+13+22+31+40 .... 015+...+150
        int[] diag_LeftTorRight_sum = new int[2 * array.length - 1];
        for (int n = 0 ; n<array.length;n++){
            for (int i= 0,j=i+n;(i<=n)&&(j>=0);i++,j--){
                diag_LeftTorRight_sum[n] += array[i][j];
            }
        }
        // 规律：1515  1415+1514  1315+1414+1513  1215+1314+1413+1513  .... 015+...+150
        for (int n = 0; n<array.length-1;n++){
            for (int j= 15,i=j-n;(i<array.length);i++,j--){
                diag_LeftTorRight_sum[diag_LeftTorRight_sum.length-1-n] += array[i][j];
            }
        }
        // 对二维数组从右上角到左下角对角线求和，结果保存到一维数组中
        // 规律：015  014+115  013+114+215  012+113+214+315  011+112+213+314+415 .... 00+...+1515
        int[] diag_RightToLeft_sum = new int[2 * array.length - 1];
        for (int n = 15;n>=0;n--){
            for (int i=0,j=i+n;i<=array.length-1-n;i++){
                diag_RightToLeft_sum[array.length - 1 - n] += array[i][j];
            }
        }
        // 规律：150  140+151  130+141+152  120+131+142+153  110+121+132+143+154 .... 00+...+1515
        for (int n = 15;n>0;n--){
            for (int i=0,j=i+n;i<=array.length-1-n;i++,j++){
                diag_RightToLeft_sum[array.length - 1 + n] += array[j][i];
            }
        }

        // 输出行累加结果
        System.out.println("该二维数组行累加结果为：");
        System.out.println(Arrays.toString(heng_sum));
        // 输出列累加结果
        System.out.println("该二维数组列累加结果为：");
        System.out.println(Arrays.toString(zong_sum));
        // 输出右上到左下对角线的累加结果
        System.out.println("该二维数组从右上到左下对角线的累加结果为：");
        System.out.println(Arrays.toString(diag_RightToLeft_sum));
        // 输出左上到右下对角线的累加结果
        System.out.println("该二维数组从左上到右下对角线的累加结果为：");
        System.out.println(Arrays.toString(diag_LeftTorRight_sum));
    }
}
